package regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 分组
 */
public class RegExp07 {

    public static void main(String[] args) {
        /*
            1.(pattern)：非命名捕获。捕获匹配的字符串。编号为0的第一个捕获是整个正则表达式模式匹配的文本
                        其他捕获结果则根据左括号的顺序从1开始自动编号
            2.(?<name>pattern)：命名捕获。将匹配的字符串捕获到一个组名或编号名称中。用于name的字符串不能包含任何标点符号
                        并且不能以数字开头。可以使用单引号替代尖括号，如(?'name')
            3.(?:pattern)： 匹配 pattern 但不捕获该匹配的子表达式，即它是一个非捕获匹配，不存储供以后使用的匹配。
                        这对于用"or"字符(|)组合模式不见的情况很有用。如：'industr(?:y|ies)' 比 'industry|industries'更经济
            4.(?=pattern)：它是一个非捕获匹配。如： 'Windows(?=95|98|NT|2000)'匹配'Windows 2000'中的"Windows"，但不匹配
                        'Windows 3.1'
            5.(?|pattern)：该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配。
                        如：'Windows(?!95|98|NT|2000)'匹配'Windows 3.1'中的'Windows'，但不匹配'Windows 2000'中的'Windows'
         */

        String content = "lmy s7789 nn1189lmy";

        //非命名分组
//        String regStr = "(\\d\\d)(\\d\\d)";

        //命名分组
        //匹配4个数字的字符串
        String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";

        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);

        while (matcher.find()) {
            // 1. matcher.group(0) 得到匹配到的字符串
            // 2. matcher.group(1) 得到匹配到的字符串的第1个分组内容
            // 3. matcher.group(2) 得到匹配到的字符串的第2个分组内容
            System.out.println("找到：" + matcher.group());
            System.out.println("第 1 个分组内容=" + matcher.group(1));
            System.out.println("第 1 个分组内容[通过组名]=" + matcher.group("g1"));
            System.out.println("第 2 个分组内容=" + matcher.group(2));
            System.out.println("第 2 个分组内容[通过组名]=" + matcher.group("g2"));
        }
    }
}
